import { _decorator, Component, Node } from 'cc'
import Singleton from '../Base/Singleton'
const { ccclass, property } = _decorator

interface IItem {
  func: Function
  context: unknown
}

/**
 * 事件中心
 */
export class EventManager extends Singleton {
  private eventDict: Map<string, Array<IItem>> = new Map()

  constructor() {
    super()
  }

  on(eventName: string, func: Function, context?: unknown) {
    if (this.eventDict.has(eventName)) {
      this.eventDict.get(eventName).push({ func, context })
    } else {
      this.eventDict.set(eventName, [{ func, context }])
    }
  }

  off(eventName: string, func: Function) {
    if (this.eventDict.has(eventName)) {
      // 找到与给定函数相等的元素的索引
      const index = this.eventDict.get(eventName).findIndex(i => i.func === func)
      // 移除与给定函数相等的元素（如果存在）
      index > -1 && this.eventDict.get(eventName).splice(index, 1)
    }
  }

  emit(eventName: string, ...params: unknown[]) {
    // 检查 eventDict 中是否存在指定的事件名称（eventName）
    if (this.eventDict.has(eventName)) {
      // 获取具有指定事件名称的事件处理函数数组
      this.eventDict.get(eventName).forEach(({ func, context }) => {
        // 对于数组中的每个事件处理函数，根据 context 参数应用函数上下文并传递参数
        context ? func.apply(context, params) : func(...params)
      })
    }
  }

  clear() {
    this.eventDict.clear()
  }
}
